#ifndef __SWEI_CMD_H
#define __SWEI_CMD_H


#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif


/*********************************************
 专用于 pf_cmd_callback_func 回调的返回值 
**********************************************/
typedef enum {
    DLCMD_RET_FINISH = 0,       // 命令处理完成，框架回复0x000B(成功)
    DLCMD_RET_ERROR = 1,        // 命令处理失败，框架回复0x000B(失败)
    DLCMD_RET_CONTINUE = 2,     // 命令处理未完成，框架不回复0x000B，由业务层后续进行回复0x000B
    DLCMD_NOT_SUPPORT = 3,
    DLCMD_IS_OTA = 4,
    DLCMD_RET_MAX
} DLCMD_RET_TYPE_ENUM;


/**
 * @brief 指令id
 */
typedef enum
{
    DOWN_LINK_CMD_ACTIVATE = 0x0001,                   // 激活
    DOWN_LINK_CMD_UNACTIVATE = 0x0002,                 // 去激活
    DOWN_LINK_CMD_FIND_BIKE = 0x0003,                  // 寻车
    DOWN_LINK_CMD_CLOSE_FIND_BIKE = 0x0004,            // 关闭寻车
    DOWN_LINK_CMD_SHAKE_SENSITIVITY = 0x0005,          // 设置震动灵敏度 0 低 / 1 标准 / 2 高
    DOWN_LINK_CMD_BLE_DISTANCE = 0x0006,               // 蓝牙感应距离设置 0 近 / 1 标准 / 2 远
    DOWN_LINK_CMD_BLE_INSEN_UNLOCK = 0x0007,           // 蓝牙无感解锁 0 关 / 1 开
    DOWN_LINK_CMD_SOUND_STATUS = 0x0008,               // 音效开关 0 关 / 1 开
    DOWN_LINK_CMD_SET_POWER_ON_SOUND = 0x0009,         // 开机音效设置 0：音效1 / 1：音效2 / 2 自定义
    DOWN_LINK_CMD_SET_POWER_OFF_SOUND = 0x000A,        // 关机音效设置 0：音效1 / 1：音效2 / 2 自定义
    DOWN_LINK_CMD_SET_FIND_BIKE_SOUND = 0x000B,        // 寻车声音设置 0：音效1 / 1：音效2 / 2 自定义
    DOWN_LINK_CMD_SET_RIDE_ABNORMAL_SOUND = 0x000C,    // 震动或骑行异常报警音设置 0：音效1 / 1：音效2 / 2 自定义
    DOWN_LINK_CMD_SET_LOW_POWER_SOUND = 0x000D,        // 电量低提醒设置 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_BARRERY_ABNORMAL_SOUND = 0x000E, // 电池电控故障声音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_SHIFT_SOUND = 0x000F,            // 换挡提示音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_MOTOR_SUPERSONIC_SOUND = 0x0010, // 电机超速音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_TBOX_BIND_SOUND = 0x0011,        // tbox绑定成功提示音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_CHARGER_LINK_SOUND = 0x0012,     // 充电器连接成功提示音 0：音效1 / 1：音效2 / 2 自定义
    DOWN_LINK_CMD_SET_BUTTERY2_LINK_SOUND = 0x0013,    // 副电池接入成功提示音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_IN_ELE_FANCE_SOUND = 0x0014,     // 进入电子围栏提示音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_OUT_ELE_FANCE_SOUND = 0x0015,    // 出电子围栏提示音 0：音效1 / 1：音效2
    DOWN_LINK_CMD_SET_CHRISTMAS_SOUND = 0x0016,        // 圣诞提示音 1 人声/2 自定义
    DOWN_LINK_CMD_SET_THANKSGIVING_SOUND = 0x0017,     // 感恩节提示音 1 人声/2 自定义
    DOWN_LINK_CMD_SET_BIRTHDAY_SOUND = 0x0018,         // 生日提示音 1 人声/2 自定义
    DOWN_LINK_CMD_SET_NEW_YEAR_SOUND = 0x0019,         // 新年提示音 1 人声/2 自定义
    DOWN_LINK_CMD_RESTORE = 0x001a,                    // 恢复出厂设置
    // ota升级
    DOWN_LINK_CMD_OTA_TBOX = 0x001b,     // tbox ota
    DOWN_LINK_CMD_OTA_BLE_TBOX = 0x001c, // tbox ble ota
    DOWN_LINK_CMD_OTA_ELEC_CON = 0x001d, // 电控ota
    DOWN_LINK_CMD_OTA_BMS = 0x001e,      // 电池 ota
    // 陀螺仪数据
    DOWN_LINK_CMD_GSENSOR_MANERGE = 0x001f, // Gsensor-manerge设置
    DOWN_LINK_CMD_GSENSOR_DRIVER = 0x0020,  // Gsensor-driver设置
    DOWN_LINK_CMD_GSENSOR_DEBUG = 0x0021,   // Gsensor-debug设置

    DOWN_LINK_CMD_LOG_UPLOAD = 0x0022,  // 日志文件上传指令
    DOWN_LINK_CMD_VOLUME = 0x0023,      // 设备TBOX声音大小 1-5
    DOWN_LINK_CMD_FENCE_ALARM = 0x0024, // 围栏报警 0：进围栏报警 1：出围栏报警 （注：开机状态下才往下发这些）
    DOWN_LINK_CMD_TBOX_REBOOT = 0x0025, // TBox重启命令
    DOWN_LINK_CMD_TBOX_INFO_COLLECT = 0x0026, // tbox一键信息收集
    DOWN_LINK_CMD_F_OTA = 0x0027,           // tbox的Fota
    DOWN_LINK_CMD_SET_UPLOAD_TIME = 0x0028, // TBOX数据上传间隔指令

    DOWN_LINK_CMD_OTA_FOR_SUB_BMS = 0x0029, // OTA副电池

    DOWN_LINK_CMD_DOWNLOAD_STATIC_PATTERN = 0x002a,  //下载L3静态模式库
    DOWN_LINK_CMD_DOWNLOAD_DYNAMIC_PATTERN = 0x002b, //下载L3动态模式库    
    DOWN_LINK_CMD_L3_FUNC_SWITCH     = 0x002c,  // L3功能开关
    
    DOWN_LINK_CMD_IMMEDIATELY_LOCATE = 0x002d, // 立即定位
    DOWN_LINK_CMD_OTA_DIS = 0x002f, // 仪表ota    
    // 最大值
    DOWN_LINK_CMD_NUM_MAX // 最大值
} DOWN_LINK_CMD_ENUM;

/**
 * @description: 定义回调函数指针
 * @param {int} 状态值
 * @param {char} * 对应的url，有些回调函数不需要，该参数可以不处理，直接传值为null
 * @param {uint16_t} 指令的opcode，在回复命令时必须携带
 * @return {int} 见DLCMD_RET_TYPE_ENUM定义
 * @Date: 2023-10-30 09:37:40
 */
typedef DLCMD_RET_TYPE_ENUM (*pf_cmd_callback_func)(DOWN_LINK_CMD_ENUM cmd_id, uint16_t cmd_opcode, const unsigned char * p_data, uint32_t data_len);

/**
 * @brief 下行命令注册接口
 * @param  cmd_id           My Param doc
 * @param  cb_func          My Param doc
 */
void swei_downlink_cmd_register(DOWN_LINK_CMD_ENUM cmd_id, pf_cmd_callback_func cb_func);

/**
 * @brief 下行命令处理入口
 * @param  cmd_id           My Param doc
 * @param  cmd_opcode       My Param doc
 * @param  p_data           My Param doc
 * @param  data_len         My Param doc
 * @return DLCMD_RET_TYPE_ENUM 
 */
DLCMD_RET_TYPE_ENUM swei_downlink_cmd_handler(DOWN_LINK_CMD_ENUM cmd_id, uint16_t cmd_opcode, const uint8_t *p_data, uint32_t data_len);


/**
 * @brief 设备下行指令功能初始化
 */
void swei_downlink_cmd_init(void);

#ifdef __cplusplus
}
#endif

#endif // __SWEI_CMD_H